// 这里只写核心代码 错误判断就不写
// 组合式设计模式 = 构造函数 + 原型对象
function Vue (options) {
  // console.log(options, typeof options)
  if (typeof options !== 'object') throw TypeError('参数类型错误')
  // 在构造函数中保存传递过来的参数对象
  this.$options = options
  // 将vue的监管区域保存起来
  this.$el = typeof options.el === 'string' ? document.querySelector(options.el) : options.el
  // 将data保存起来便于后续进行数据劫持
  this._data = options.data
  // 这里普及基本常识 约定
  // _开始的属性表示私有属性 不允许外界去访问的 Symbol制作私有属性更好点
  this.initData()
}
Vue.prototype = {
  initData () {
    // vue初始化数据的方法
    // Object.keys(this._data) 获取对象中所有的key放到数组中 // ['name', 'age']
    var data = this._data
    Object.keys(data).forEach(property => {
      // console.log(item) // name age
      // 下面我们就要对属性进行数据劫持
      // Object.defineProperty(要劫持的数据对象, 属性, {})
      let value = data[property]
      Object.defineProperty(data, property, {
        // 可以配置 可写入 可枚举
        // enumerable: true,
        set: function reactiveSetter (newVal) {
          // 当要劫持的对象上的属性被修改了 会触发
          value = newVal
          console.log(newVal, `属性${property}被修改了`)
        },
        get: function reactiveGetter () {
          // // 当要劫持的对象上的属性被获取了 会触发
          console.log(`属性${property}被获取了`)
          return value
        }
      })
    })
  }
}
